from django.http import request
from rest_framework.generics import CreateAPIView, GenericAPIView
from rest_framework import mixins
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet

from BYD_ERP.utils.base_views import MultipleDestroyMixin
from BYD_ERP.utils.pagination import GlobalPagination
from erp_system.models import UserModel
from BYD_ERP.apps.erp_system.serializer.user_serializer import UserRegisterSerializer, UserUpdateOrDeleteSerializer, \
    UserGetSerializer, ResetPasswordSerializer


class RegisterView(CreateAPIView):
    """
        create:
        注册用户：

        参数：username, password是必传的， phone和real_name是可选的参数， return：添加之后的user对象
    """
    queryset = UserModel.objects.all()
    serializer_class = UserRegisterSerializer


# 当前视图类，除了用户注册和密码修改之外，其他所有用户管理操作
class UserView(mixins.UpdateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.DestroyModelMixin,
               mixins.ListModelMixin,
               MultipleDestroyMixin,
               GenericViewSet):
    """
        destroy:
        用户--删除：

        用户删除，status：204（成功），return：None

        multiple_delete:
        用户--批量删除：

        用户批量删除，status：204（成功），return：None

        partial_update:
        用户--局部修改，只是修改用户的角色和用户所在的部门，还包括用户的手机号和真实姓名：

        用户局部修改，status：200（成功），return：修改后的用户信息

        update:
        用户--修改，只是修改用户的角色和用户所在的部门，还包括用户的手机号和真实姓名：

        用户修改，status：200（成功），return：修改后的用户信息

        retrieve:
        查询某一个用户：

        list:
        查询所有用户列表：

    """
    # UpdateModelMixin：用户修改
    # RetrieveModelMixin：单个查询
    # DestroyModelMixin：删除
    # ListModelMixin：查询列表（用到分页）

    queryset = UserModel.objects.all()
    pagination_class = GlobalPagination

    def get_serializer_class(self):

        # 测试axios前端请求
        # r = request
        # return {'msg': '调用了一个get请求'}

        # 如果是修改和删除的操作，使用一个统一的序列化
        if self.action == 'partial_update' or self.action == 'update' or self.action == 'destroy':
            return UserUpdateOrDeleteSerializer
        else:
            return UserGetSerializer

    # 测试axios前端请求
    def get(self):
        r = request
        return {'msg': '调用了一个get请求'}

    # 测试axios前端请求
    def post(self, request):
        data = {'key': 'value测试'}
        return Response(data)
        # return {'msg': '调用了一个post请求'}


class ResetPasswordView(mixins.UpdateModelMixin, GenericAPIView):
    """
        patch:
        用户--重置密码，需要输入原始密码，新密码和新密码的确认

        用户重置密码，status：200（成功），return：修改之后的用户，但不显示密码
    """

    queryset = UserModel.objects.all()
    serializer_class = ResetPasswordSerializer

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)


# 测试axios
class AxiosTest(mixins.UpdateModelMixin, mixins.RetrieveModelMixin,
                mixins.DestroyModelMixin,
                mixins.ListModelMixin, GenericViewSet, GenericAPIView):

    def get(self):
        return {'msg': '调用了一个get请求'}

    def post(self):
        return {'msg': '调用了一个post请求'}
